home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 1992 August / info-mac-1992.iso / Applications (app) / STvi / stevie 3.10 / malloc.c < prev    next >
Text File  |  1991-01-04  |  2KB  |  111 lines

  1. /* 
  2.  * Malloc() and free() for use with Stevie for the Mac.
  3.  *
  4.  * Earle R. Horton, November 21, 1989
  5.  *
  6.  * Source:  These routines are for the most part adaptations of 
  7.  *     the storage allocator example program from pages 173-177
  8.  *    of "The C Programming Language" by Brian Kernighan and
  9.  *    Dennis M. Ritchie, Prentice-Hall Software Series, 1978
  10.  *
  11.  */
  12. #include <Memory.h>
  13.  
  14. #define safety 65000L
  15. #ifndef NULL
  16. #define NULL 0L
  17. #endif
  18.  
  19. typedef long ALIGN;
  20. union header{
  21.     struct{
  22.         union header *ptr;
  23.         unsigned long size;
  24.     } s;
  25.     ALIGN    x;
  26. };
  27. typedef union header HEADER;
  28.  
  29. static HEADER base;
  30. static HEADER *allocp  = NULL;
  31.  
  32. char *lmalloc(nbytes)
  33. unsigned long nbytes;
  34. {
  35.     HEADER *morecore();
  36.     register HEADER *p,*q;
  37.     register long nunits;
  38.     
  39.     nunits = 1+(nbytes+sizeof(HEADER)-1)/sizeof(HEADER);
  40.     if ((q = allocp) == NULL){
  41.         base.s.ptr = allocp = q = &base;
  42.         base.s.size = 0;
  43.     }
  44.     for(p = q->s.ptr; ;q=p, p=p->s.ptr){
  45.         if(p->s.size >= nunits){
  46.             if(p->s.size == nunits)
  47.                 q->s.ptr = p->s.ptr;
  48.             else{
  49.                 p->s.size -= nunits;
  50.                 p += p->s.size;
  51.                 p->s.size = nunits;
  52.             }
  53.             allocp = q;
  54.             return((char *)(p + 1));
  55.         }
  56.         if (p == allocp)
  57.             if ((p = morecore(nunits))==NULL){
  58.                 emsg("malloc() failed!");
  59.                 return(NULL);
  60.             }
  61.     }
  62. }
  63. char *malloc(nbytes)
  64. unsigned int nbytes;
  65. {
  66.     return lmalloc((long)nbytes);
  67. }
  68. #define NALLOC 128
  69. static HEADER *morecore(nu)
  70. unsigned long nu;
  71. {
  72.     char *sbrk();
  73.     register char *cp;
  74.     register HEADER *up;
  75.     register long rnu;
  76.     register long s;
  77.     
  78.     if(FreeMem() < safety) return NULL;
  79.     rnu = NALLOC * ((nu+NALLOC-1)/NALLOC);
  80.     cp = NewPtr(rnu*sizeof(HEADER));
  81.     if(cp == NULL) return NULL;
  82.     up = (HEADER *)cp;
  83.     up->s.size = rnu;
  84.     free((char *)(up + 1));
  85.     return(allocp);
  86. }
  87. free(ap)
  88. char *ap;
  89. {
  90.     register HEADER *p,*q;
  91.     if(ap){
  92.         p = (HEADER *)ap - 1;
  93.         for (q = allocp; !(p > q && p < q->s.ptr); q = q->s.ptr)
  94.             if (q >= q->s.ptr && (p > q || p < q->s.ptr))
  95.                 break;
  96.         if (p + p->s.size == q->s.ptr){
  97.             p->s.size += q->s.ptr->s.size;
  98.             p->s.ptr = q->s.ptr->s.ptr;
  99.         }
  100.         else
  101.             p->s.ptr = q->s.ptr;
  102.         if (q + q->s.size == p){
  103.             q->s.size += p->s.size;
  104.             q->s.ptr = p->s.ptr;
  105.         }
  106.         else
  107.             q->s.ptr = p;
  108.         allocp = q;
  109.     }
  110. }
  111.